گرافیک در برنامه
 
راز شب 14
نرم افزار - شعر - عـکس
 
 

اين مقاله مناسب كاربراني مي باشد كه استفاده زيادي از گرافيك در برنامه هاي خودشان مي كنند. توسط اين مقاله مي توانيد تا يك تصوير نقشه بيتي را در داخل صفحه با زواياي مختلف بچرخانيد .


( شكل شماره – 1 )

اجازه دهيد تا در ابتدا نگاهي به اين موضوع از نظر رياضيات بياندازيم. از نظر رياضيات ، هر نقطه اي مي تواند حول يك نقطه ديگر و با زواياي مختلف بچرخد. اگر به شكل شماره 1 توجه فرماييد ، خواهيد ديد كه نقطه ( يا نيم خط ( P مي تواند حول نقطه O و در زواياي مختلفي بچرخد.

فرمولي كه در رياضي براي چرخاندن يك نقطه حول نقطه ثابت و با زاويه مشخص است ، بدين صورت مي باشد :


حال اگر بخواهيم نقطه مذكور را حول يك نقطه ديگر بچرخانيم به اين فرمول احتياج پيدا خواهيم كرد :


اين فرمولها به صورت ماتريسي نوشته شده اند. به طور كلي ماتريسها كمك بسيار زيادي در رابطه با گرافيك و تغييرات آن اعمال مي كنند. در بسياري از روشهاي ويرايش يك تصوير يا گرافيك ، ما از ماتريسها كمك مي گيريم.


حال اجازه دهيد اين فرمول را به دستورات دلفي تبديل كنيم و نتيجه آن را مشاهده كنيم ...


كد:

CONST
MaxPixelCount = 32768;

TYPE
TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple;
pRGBTripleArray = ^TRGBTripleArray;
...

// "Simple" approach. For pixel (i,j), use "reverse" rotation to find
// where the rotated pixel must have been before the rotation.
// Don't bother with center of pixel adjustment.
// Assumes input BitmapOriginal has PixelFormat = pf24bit.
FUNCTION RotateBitmapMethod1 (CONST BitmapOriginal: TBitmap;
CONST iRotationAxis, jRotationAxis: INTEGER;
CONST AngleOfRotation: DOUBLE {radians} ): TBitmap;

VAR
cosTheta : EXTENDED;
i : INTEGER;
iOriginal : INTEGER;
iPrime : INTEGER;
j : INTEGER;
jOriginal : INTEGER;
jPrime : INTEGER;
RowOriginal: pRGBTripleArray;
RowRotated : pRGBTRipleArray;
sinTheta : EXTENDED;
BEGIN
// The size of BitmapRotated is the same as BitmapOriginal. PixelFormat
// must also match since 24-bit GBR triplets are assumed in ScanLine.
RESULT := TBitmap.Create;
RESULT.Width := BitmapOriginal.Width;
RESULT.Height := BitmapOriginal.Height;
RESULT.PixelFormat := pf24bit; // Force this

// Get SIN and COS in single call from math library
sincos(AngleOfRotation, sinTheta, cosTheta);

// If no math library, then use this:
// sinTheta := SIN(AngleOfRotation);
// cosTheta := COS(AngleOfRotation);

// Step through each row of rotated image.
FOR j := RESULT.Height-1 DOWNTO 0 DO
BEGIN
RowRotated := RESULT.Scanline[j];
jPrime := j - jRotationAxis;

FOR i := RESULT.Width-1 DOWNTO 0 DO
BEGIN
iPrime := i - iRotationAxis;
iOriginal := iRotationAxis + ROUND(iPrime * CosTheta - jPrime * sinTheta);
jOriginal := jRotationAxis + ROUND(iPrime * sinTheta + jPrime * cosTheta);

// Make sure (iOriginal, jOriginal) is in BitmapOriginal. If not,
// assign blue color to corner points.
IF (iOriginal >= 0) AND (iOriginal <= BitmapOriginal.Width-1) AND
(jOriginal >= 0) AND (jOriginal <= BitmapOriginal.Height-1)
THEN BEGIN
// Assign pixel from rotated space to current pixel in BitmapRotated
RowOriginal := BitmapOriginal.Scanline[jOriginal];
RowRotated[i] := RowOriginal[iOriginal]
END
ELSE BEGIN
RowRotated[i].rgbtBlue := 255; // assign "corner" color
RowRotated[i].rgbtGreen := 0;
RowRotated[i].rgbtRed := 0
END

END
END
END {RotateBitmapMethod1};



همان طور كه در كد بالا ملاحظه مي فرماييد ما از دستور ScanLine جهت چاپ و نمايش پيكسلهاي تصوير استفاده كرده ايم. اين دستور يكي از بهترين دستورات دلفي براي نمايش پيكسلهاي تصوير مي باشد.
اين دستور به صورت اسمبلي تدوين شده است و نتيجه آن بسيار سريع مي باشد و سرعت نمايش آن نسبت به ساير دستورات ترسيم ، به خاطر خطي بودن آن ، بسيار بالاتر مي باشد.

در ابتدا ما به صورت موقت يك تصوير نقشه بيتي ديگر مي سازيم. سپس تصوير اوليه را با استفاده از فرمول ذكر شده ، مي چرخانيم و در تصوير جديد قرار مي دهيم. نتيجه يا همان Result اين Function به صورت يك تصوير نقشه بيتي مي باشد كه همان تصوير چرخانده شده است.

به خاطر داشته باشيد كه تمامي دستورات مربوط به گرافيك و سرعت عملكرد آنها بستگي كامل به سرعت كامپيوتر كاربر دارد.

موفق باشيد


نظرات شما عزیزان:

نام :
آدرس ایمیل:
وب سایت/بلاگ :
متن پیام:
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

 

 

 

عکس شما

آپلود عکس دلخواه:






ارسال شده در تاریخ : یک شنبه 19 شهريور 1390برچسب:, :: 22:12 :: توسط : رضا بوالحسنی

درباره وبلاگ
سلام به وبلاگه من خوش امدید لطفا ایمیلتون رو توی خبرنامه وبلاگم پبت کنید تا زمانی که آپ کردم بهتون خبر بدم و خواهشا توی نظر سنجی وبلاگم شرکت کنید . مرسی
آخرین مطالب
نويسندگان
پيوندها

تبادل لینک هوشمند
برای تبادل لینک  ابتدا ما را با عنوان راز شب 14 و آدرس raze-shabe14.LXB.ir لینک نمایید سپس مشخصات لینک خود را در زیر نوشته . در صورت وجود لینک ما در سایت شما لینکتان به طور خودکار در سایت ما قرار میگیرد.






ورود اعضا:

نام :
وب :
پیام :
2+2=:
(Refresh)

<-PollName->

<-PollItems->

خبرنامه وب سایت:





آمار وب سایت:  

بازدید امروز : 22
بازدید دیروز : 11
بازدید هفته : 22
بازدید ماه : 519
بازدید کل : 57333
تعداد مطالب : 79
تعداد نظرات : 396
تعداد آنلاین : 1